Fix bug that service os & vmx guest can't communicate with
authorkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sat, 10 Sep 2005 14:17:02 +0000 (14:17 +0000)
committerkaf24@firebug.cl.cam.ac.uk <kaf24@firebug.cl.cam.ac.uk>
Sat, 10 Sep 2005 14:17:02 +0000 (14:17 +0000)
each other. The bug was physical packets smaller than
minimal packet size of 60 bytes were gettign thrown away.
Hence ARP traffic for example was dropped.

Signed-off-by: Edwin Zhai <edwin.zhai@intel.com>
Signed-off-by: Xiaofeng Ling <xiaofeng.ling@intel.com>
tools/ioemu/hw/pcnet.c

index c2a96af636264b60e87312417cabc05730746d07..b713996a2eacaead5c7744086c170cf263752c8a 100644 (file)
@@ -380,10 +380,13 @@ static int pcnet_can_receive(void *opaque)
     return sizeof(s->buffer)-16;
 }
 
+#define MIN_BUF_SIZE 60
+
 static void pcnet_receive(void *opaque, const uint8_t *buf, int size)
 {
     PCNetState *s = opaque;
     int is_padr = 0, is_bcast = 0, is_ladr = 0;
+    uint8_t buf1[60];
 
     if (CSR_DRX(s) || CSR_STOP(s) || CSR_SPND(s) || !size)
         return;
@@ -392,6 +395,14 @@ static void pcnet_receive(void *opaque, const uint8_t *buf, int size)
     printf("pcnet_receive size=%d\n", size);
 #endif
 
+    /* if too small buffer, then expand it */
+    if (size < MIN_BUF_SIZE) {
+        memcpy(buf1, buf, size);
+        memset(buf1 + size, 0, MIN_BUF_SIZE - size);
+        buf = buf1;
+        size = MIN_BUF_SIZE;
+    }
+
     if (CSR_PROM(s) 
         || (is_padr=padr_match(s, buf, size)) 
         || (is_bcast=padr_bcast(s, buf, size))